/**
////////////////////////////////////////////////////////////////////
//                          _ooOoo_                               //
//                         o8888888o                              //
//                         88" . "88                              //
//                         (| ^_^ |)                              //
//                         O\  =  /O                              //
//                      ____/`---'\____                           //
//                    .'  \\|     |//  `.                         //
//                   /  \\|||  :  |||//  \                        //
//                  /  _||||| -:- |||||-  \                       //
//                  |   | \\\  -  /// |   |                       //
//                  | \_|  ''\---/''  |   |                       //
//                  \  .-\__  `-`  ___/-. /                       //
//                ___`. .'  /--.--\  `. . ___                     //
//              ."" '<  `.___\_<|>_/___.'  >'"".                  //
//            | | :  `- \`.;`\ _ /`;.`/ - ` : | |                 //
//            \  \ `-.   \_ __\ /__ _/   .-` /  /                 //
//      ========`-.____`-.___\_____/___.-`____.-'========         //
//                           `=---='                              //
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        //
//            佛祖保佑       永不宕机     永无BUG                    //
////////////////////////////////////////////////////////////////////
 * 
 * 
 * 
 * 什么是动态资源：相对静态资源(图片，css,js前端文件,) 需要访问数据库(redis mysql......).
 * 
 * url 的资源定位：我们简单把 /home/css/demo.css 我们认为这种就是 静态资源， 
 * 
 *                动态资源： ?a=index&c=index a 表示 action ，c 表示 controller
 * 
 * 
 *                             http://localhost:8080/demo.html?a=index&c=index
 * 
 *                         url: http://localhost:8080/demo.html?a=index&c=index
 * 
 *                         uri:demo.html?a=index&c=index
 * 
 *                         path:demo.html (这个path 也是开发者自己定义的,这种格式没限定 demo.html(写成 .html 为了seo ) 
 *                              也可以写 demo 也可以 demo.htm)
 * 
 *                         query: a=index&c=index 就可以理解为服务端传递参数用的，数据进行查找
 * 
 * 
 * 
 * 
 * 
 * 
 */





let http = require("http");
let fs = require("fs");
let nunjucks = require("nunjucks");

let server = http.createServer();

server.listen(8080);

server.on('request', async function (req, res) {
    let url = req.url;

    console.log(url);
    //静态资源与动态资源判断
    //在web服务器，要尽量使用异步函数
    //web服务器给谁用的，给用户，给管理员用
    //node自身的问题，node 是单线程的.
    //404 页面
    if (url.lastIndexOf('.') > -1) {
        console.log(url);
        let path = '.' + url;
        readFileByPromise(path, res);
    } else {

        res.setHeader("Content-type", "text/html;charset=utf8");
        //去除query,使用split 以 demo?a=index&c=index 为例

        let queryString = url.split("?")[1];//a=index&c=index  

        let queryArr = queryString.split("&");// ['a=index','c=index'];

        let keyVals = [];
        for (let key in queryArr) {
            let vals = queryArr[key];//'a=index'.......
            let temArray = vals.split("=");
            keyVals[temArray[0]] = temArray[1];
        }
        //给 req 对象添加一个 query
        req.query = keyVals;
        console.log(keyVals['c']);
        let controllerPath = './home/controller/' + keyVals['c'].replace(keyVals[0], keyVals['c'][0].toUpperCase()) + "Controller";
        //正常的项目.controller 是由多个的，model也是有多个的,所以通过url 可动态的调用
        let controller = require(controllerPath);//controller 就是一个 class
        //console.log(keyVals['a']);
        //keyVals['a'] 变量吧,所以在json 里面，要去调用它的key ,用 .方式 key必须是个常量,
        console.log(controller);
        let action = keyVals['a'];
        let obj = new controller(req, res, nunjucks);
        let content = await obj[action]();
        //console.log(content);
        res.write(content);
        res.end();
        //
    }

})


let promise = function (filename) {

    return new Promise(function (resolve, reject) {

        fs.exists(filename, function (result) {
            if (!result) {
                filename = './home/imgs/404.png';
            }
            fs.readFile(filename, function (err, data) {
                resolve(data);
            })
        })
    })
}

async function readFileByPromise(fileName, res) {
    let data = await promise(fileName);
    if (data) {
        res.write(data);
    }
    res.end();
}

/*
 * h5 + css + vue + webapi 根本
 *
 *
 */


/**
 * 搭建个自己的网站，实现动态网页，与动态网页的渲染展示
 *
 * 优化 数据库的查询(使用promise) + 去了解下 js的 class
 *
 *
 */